home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Original Shareware 1.1
/
The Original Shareware (WeMake CDs)(Volume 1.1)(CDs, Inc)(1993).iso
/
6
/
argv.zip
/
ARGV.TXT
Wrap
Text File
|
1987-01-25
|
5KB
|
153 lines
Page 1 of 3
A R G C & A R G V
The Command Line Variables
By
S. R. Sampson
Compuserve 75136,626
Recently there was a discussion concerning pointers in 'C' and
the question was asked:
Why do some programs use **argv and others use *argv[]?
This article will explain the meanings of these two declarations
and show why they can be considered synonamous.
Wherever you see **argv, you can substitute *argv[]. They are
both the same:
char **argv; In English, argv is a pointer to a
pointer to a character.
char *argv[]; In English, argv is an array of
pointers to characters.
Initially we have what appears to be two different declarations
both visually and when written in English. In the first example
it is implying that there is only one pointer to a character. In
the second example it is implying that there are one or many
pointers to characters; or an array of pointers.
Let's go through an example and see how the command line is
operated on and stored in memory.
For instance let's say an operator typed:
cc -O test.c
Which would look like this in memory:
_____________________________________________________
/___________________________________________________/|
| c | c | | - | O | | t | e | s | t | . | c | \n |/
----------------------------------------------------
When you execute a 'C' compiled program the first thing that
executes is the run-time library which is attached to every
program. This will examine the command line and search for a
space delimiter between options or a newline character to signify
the end of the command. The run-time will gather each option
into character arrays (strings). For instance our example will
produce the following strings:
"cc", "-O", "test.c"
Page 2 of 3
A R G C & A R G V
- The Command Line Variables....
These strings are stored in memory and will appear like so:
_________________________________________________________
/_____________/____________/____________________________/|
| c | c | \0 | - | O | \0 | t | e | s | t | . | c | \0 |/
--------------------------------------------------------
^ ^ ^
| | |
0900 0903 0906
The run-time also makes an array of pointers which will point to
the start of each string. These pointers will be stored in
memory also. Let's call the array argv. In our sample command
line we have three string arrays, so we will also have three
pointers. The examples are using imaginary memory locations for
storage.
argv[0] = 0x0900 which points to "cc"
argv[1] = 0x0903 which points to "-O"
argv[2] = 0x0906 which points to "test.c"
and will look like this in memory:
argv[0] argv[1] argv[2]
________________________________
/__________/_________/_________/|
| 09 | 00 | 09 | 03 | 09 | 06 |/
-------------------------------
^ ^ ^
| | |
0950 0952 0954
The memory pointer 0x0900 is a pointer to a character. Well, we
have to store this pointer somewhere, Let's put it in memory
location 0x0950, as illustrated above, and put the next pointer
in location 0x0952 and finally the third in 0x0954.
Page 3 of 3
A R G C & A R G V
- Command Line Variables....
Question: What does memory location 0x0950 have in it?
Answer: It has 0x0900 - a pointer to a character.
So 0x0950 is a pointer to - a pointer to a character:
char **argv;
You can see now how the declaration has meaning, and you can also
see that it does not fully describe the true state of things.
That is, there may be more pointers than just one. Many people
like the array declaration which tends to describe the true
structure of most command lines:
char *argv[];
The operation of the run-time package finally finishes and is
ready to begin your program. It calls your program just like a
function call:
main( 3,0950 )
Which says we have three pointers beginning at location 0950.
Then along comes your program:
main( argc, argv )
int argc; argc is the number of pointers (3).
char **argv; argv is a pointer (0950) to a pointer (0900)
to a character 'c'.
or
char *argv[]; argv is an array of pointers to characters
beginning at (0950).
I hope this will assist you in visualizing the command line
process and answer an often asked question.